Re: [PATCH/v2] git-basis, a script to manage bases for git-bundle

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jun 30, 2008 at 06:49:25PM -0400, Adam Brewster wrote:

> Git-basis is a perl script that remembers bases for use by git-bundle.
> Code from rev-parse was borrowed to allow git-bundle to handle --stdin.

I don't use bundles myself, so I can't comment on how useful this is for
a bundle-based workflow. But it seems like a sensible idea in general.

A few comments:

> --- a/bundle.c
> +++ b/bundle.c
> @@ -227,8 +227,26 @@ int create_bundle(struct bundle_header *header,
> const char *path,
> 
>        /* write references */
>        argc = setup_revisions(argc, argv, &revs, NULL);
> -       if (argc > 1)
> -               return error("unrecognized argument: %s'", argv[1]);
> +
> +       for (i = 1; i < argc; i++) {
> +               if ( !strcmp(argv[i], "--stdin") ) {

When a new feature depends on other, more generic improvements
to existing code, it is usually split into two patches. E.g.,

  1/2: add --stdin to git-bundle
  2/2: add git-basis

with the advantages that:

 - it is slightly easier to review each change individually
 - it is easier for other features to build on the generic improvement
   without requiring part 2, especially if part 2 is questionable

As it happens in this case, I think in this case the change was already
easy to read, being logically separated by file, so I am nitpicking
somewhat. But splitting changes is a good habit to get into.

> +                               if (len && line[len - 1] == '\n')
> +                                       line[--len] = 0;

Style: we usually spell NUL as '\0'.

> diff --git a/git-basis b/git-basis
> new file mode 100755

This should be git-basis.perl, with accompanying Makefile changes.

> +if ( ! -d "$d/bases" ) {
> +    system( "mkdir '$d/bases'" );
> +}

Yikes. This fails if $d contains an apostrophe. You'd want to use
quotemeta to properly shell out. But there's no need at all to shell out
here, since perl has its own mkdir call.

> +if ( $#ARGV == -1 ) {
> +    print "usage: git-basis [--update] basis1...\n";
> +    exit;

Usage should probably go to STDERR.

> +    my %new = ();
> +    while (<STDIN>) {
> +       if (!/^^?([a-z0-9]{40})/) {next;}
> +       $new{$1} = 1;
> +    }

Why make a hash when the only thing we ever do with it is "keys %new"?
Shouldn't an array suffice?

> +    foreach my $f (@ARGV) {
> +       my %these = ();
> +       open F, "<$d/bases/$f" || die "Can't open bases/$f: $!";

Style: I know we are not consistent within git, but it is usually better
to use local variables for filehandles these days. I.e.,

  open my $fh, "<$d/bases/$f"

> +       open F, ">>$d/bases/$f" || die "Can't open bases/$f: $!";

So the basis just grows forever? That is, each time we do a bundle and
basis update, we add a line for every changed ref, and we never delete
any lines. But having a commit implies having all of its ancestors, so
in the normal case (i.e., no rewind or rebase) we can simply replace old
objects if we know they are a subset of the new ones (which you can
discover with git-merge-base). For the rewind/rebase case, probably
these lists should get pruned eventually for non-existent objects.

But maybe it is not worth worrying about this optimization at first, and
we can see if people complain. In that case, it is perhaps worth a note
in the 'Bugs' section (or 'Discussion' section) of the manpage.

> +       print F "\#" . `date`;

I don't think there are any portability issues with 'date' (especially
since it appears to be just a comment here, so we don't really care
about the format), but in general I think it is nicer to use perl's date
functions just for consistency's sake.

> --
> 1.5.5.1.211.g65ea3.dirty

Notably absent: any tests.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux