10 our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
14 @EXPORT = qw(parse_branch_spec current_tb_branch run_git_1line);
21 open GIT, "-|", 'git', @_ or die $!;
24 close GIT or die "git @_ failed ($?)\n";
25 chomp $l or die "@_ ?";
31 if (!defined $git_dir) {
32 $git_dir = run_git_1line(qw(rev-parse --git-dir));
37 sub current_tb_branch () {
38 open R, git_dir().'/HEAD' or die "open HEAD $!";
39 my $ref = <R>; defined $ref or die $!;
42 if ($ref !~ s#^ref: ##) {
48 if ($ref =~ m#^refs/topbloke-(tip|base)s/([^/\@]*)\@([^/\@]*)/([^/]*)/#) {
56 DepSpec => "$2\@$3/$4/$'",
58 } elsif ($ref =~ m#^refs/heads/#) {
72 sub parse_branch_spec ($) {
75 my $spec = { }; # Email Domain DatePrefix DateNear Nick
77 my ($key,$val,$whats) = @_;
78 die "multiple $whats in branch spec\n" if exists $spec->{$key};
83 if (s#([^/\@]*)\@([^/\@]*)/##) {
84 $set->('Email', $1, "email local parts") if length $1;
85 $set->('Domain', $2, "email domains") if length $1;
86 } elsif (s#([^/]*\~[^/]*)/##) {
89 open DATE, "-|", 'date','+%s','-d',$dspec or die $!;
91 close DATE or die "date parsing failed\n";
93 $set->('DateNear', $l, 'nearby dates');
94 } elsif (s#^([0-9][^/]*)/##) {
97 m/^\d{4}(?:-\d\d(?:-\d\d(?:T(?:\d\d(?:\d\d(?:\d\d(?:Z)?)?)?)?)?)?)?$/
98 or die "bad date prefix \`$dspec'\n";
99 $set->('DatePrefix', $dspec, 'date prefixes');
102 } elsif (s#^\.\./##) {
109 if (defined $rel_levels) {
110 my $branch = current_tb_branch();
111 if (!defined $branch->{Nick}) {
112 die "relative branch spec \`$orig',".
113 " but current branch not a topbloke branch\n";
115 my ($ceaddr,$cdate,@l) = split /\//, $branch->{Nick};
117 die "relative branch spec \`$orig' has too many ../s\n";
118 $_ = (join '/', @l[0..$#l-$rel_levels]).'/'.$_;
124 sub setup_config () {
125 my ($files) = (qw(msg deps included flags gitattributes));
127 foreach my $file ($files) {
128 my $cfgname = "merge.topbloke-$file.";
129 my $current = run_git_1line(qw(config), "$cfgname.driver");
130 next if $current =~ m/^topbloke-merge-driver --v$version /o;
131 debug("setting merge driver $file");
132 run_git_1line(qw(config), "$cfgname.name",
133 "topbloke merge driver for $file");
134 run_git_1line(qw(config), "$cfgname.driver",
135 "topbloke-merge-driver --v$version $file %O %A %B %L");