Skip to content

Conversation

@lw2011
Copy link

@lw2011 lw2011 commented Oct 10, 2022

Filtering filenames with regex has some drawbacks:

  • refinery_cli will silently skip filenames like "V1__first.base.rs" or "V2__second-base.rs" without any logging/feedback to the user
    • user should be made aware what exactly is wrong with his filenames
  • refinery would allow filenames like "V1.5__first.base.rs" with decimal version numbers and will try to convert them into integers.
    • refinery's database table stores versions as integers

@lw2011 lw2011 force-pushed the improve_bad_filename_feedback_to_user branch 7 times, most recently from 2c9a8df to f48a87c Compare October 17, 2022 07:41
Copy link
Member

@jxs jxs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, and thanks for this! This is great work, only some minor nitpicks to address.

use std::fmt::Formatter;

// regex used to match file names
// regex used to preliminary match migration semantics from filenames
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// regex used to preliminary match migration semantics from filenames
// Regex used to preliminary match migration semantics from filenames.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied.

.filter_map(Result::ok)
.map(DirEntry::into_path)
// filter by migration file regex
// filter by migration type encoded in file extension
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// filter by migration type encoded in file extension
// Filter by migration type encoded in file extension.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied.

/// An Error from an invalid file name migration
#[error("migration name must be in the format V{{number}}__{{name}}")]
InvalidName,
#[error("migration filename must be in the format V{{number}}__{{name}}.rq|sql")]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
#[error("migration filename must be in the format V{{number}}__{{name}}.rq|sql")]
#[error("migration filename must be in the format V{{number}}__{{name}}.rs|sql")]

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, applied.

use std::fmt::Formatter;

// regex used to preliminary match migration semantics from filenames
// regex matching migration semantics for filenames
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// regex matching migration semantics for filenames
// Regex matching migration semantics for filenames.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied.

.with_context(|| format!("could not read migration file name {}", path.display()))?;
let migration = Migration::unapplied(&filename, &sql).with_context(|| {
format!(
"Could not create new unapplied migration with filename {}",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we want to mention to the user that we are creating an unapplied Migration? I'd say it can be a little confusing as it's giving internal information while the user should only care if the file could or could not be read wdyt?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes you are right, I changed the message.

@lw2011 lw2011 force-pushed the improve_bad_filename_feedback_to_user branch from f48a87c to 551d207 Compare November 29, 2022 15:23
@lw2011 lw2011 requested a review from jxs November 29, 2022 15:29
Lukasz Wisniowski and others added 5 commits November 29, 2022 16:32
* refinery_cli will silently skip filenames like "V1__first.base.rs" or "V2__second-base.rs"  without any logging/feedback to the user
  * user should be made aware what exactly is wrong with his filenames

* refinery will allow filenames like "V1.5__first.base.rs" with decimal version numbers and will try to convert them into integers.
  * refinery's database table stores versions as integers
* Feeds nice error messages to the user.
* Before the change runner would not have a chance to inspect the
  formatting of input name.
* including file's extension
@lw2011 lw2011 force-pushed the improve_bad_filename_feedback_to_user branch from 551d207 to e017426 Compare November 29, 2022 15:33
Copy link
Member

@jxs jxs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry Łuksaz, just one more thing. Btw please don't force push as I lose context of which files I have already reviewed.

// Regex matching migration semantics for filenames.
pub fn file_match_re() -> Regex {
Regex::new(r"^([U|V])(\d+(?:\.\d+)?)__(\w+)").unwrap()
Regex::new(r"^(?P<type>[^_])(?P<version>[^_]+)__(?P<name>.+)(?P<extension>\.(sql|rs))$")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd rather here we still only capture U|V to not raise errors for other files in the path, btw why did you change the version from d+ ?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @jxs ,

not raise errors for other files in the path

is it likely at all that someone uses filenames with two consecutive underscores in a project?

If the pattern would not search for __ , then I would leave V|U. Then the regex would need to accept both lower and upper cases letters. But it does match on __, so I find the checking of the version outside of regex better.

why did you change the version from d+

to output a better error to the user.

Additionally now fraction version are not allowed. For example, before the change, the filename V1.1__add.rs would have a match and the version would be 1.1 which is not supported by the database struct.

@jxs
Copy link
Member

jxs commented Jul 25, 2025

this is now stale, going to close, thanks Łukaz!

@jxs jxs closed this Jul 25, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants