diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-09-14 09:13:17 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-09-14 09:13:17 +0200 |
commit | aacdfc0b674f09ba0545be0529ad4b4dfccb2176 (patch) | |
tree | 2bbad4551f05c3485d7f532edc1a1c65292a5114 | |
parent | f00fa7c860e3da817fd4b88a2d58cae130a70d50 (diff) | |
download | savane-gray-aacdfc0b674f09ba0545be0529ad4b4dfccb2176.tar.gz savane-gray-aacdfc0b674f09ba0545be0529ad4b4dfccb2176.tar.bz2 |
Fix visualization of subordinate repos
* backend/accounts/sv_groups: Recreate missing cgitrepos file.
Create git feature object to make sure the repository path
is correct.
* lib/Savane/Feature.pm (directory): New method.
* db/mysql/table_git_repo.structure: Make sure no repository
name can appear twice for the same group ID.
-rwxr-xr-x[-rw-r--r--] | backend/accounts/sv_groups | 69 | ||||
-rw-r--r-- | db/mysql/table_git_repo.structure | 1 | ||||
-rw-r--r-- | lib/Savane/Feature.pm | 19 |
3 files changed, 67 insertions, 22 deletions
diff --git a/backend/accounts/sv_groups b/backend/accounts/sv_groups index f5778f4..d9d82ce 100644..100755 --- a/backend/accounts/sv_groups +++ b/backend/accounts/sv_groups @@ -137,7 +137,7 @@ foreach my $ref (GetDBHashArray("groups g, group_type t", if ($ref->{"use_$f"}) { $ref->{feature}{$f}{dir_type} = $ref->{"dir_type_$f"}; $ref->{feature}{$f}{dir} = - (exists $ref->{"dir_$f"} and $ref->{"dir_$f"} ne '') + (exists $ref->{"dir_$f"} && $ref->{"dir_$f"} ne '') ? $ref->{"dir_$f"} : $ref->{"group_type_dir_$f"}; } @@ -224,6 +224,11 @@ foreach my $ref (GetDBHashArray("git_repo r,groups g,group_type t", } } +if (($sys_git_projects_file && ! -e $sys_git_projects_file) + || ($sys_git_cgitrepos_file && ! -e $sys_git_cgitrepos_file)) { + $updateinfo = 1; +} + if ($updateinfo && ($sys_git_projects_file || $sys_git_cgitrepos_file)) { my $f = $sys_git_projects_file; if (defined($sys_git_cgitrepos_file)) { @@ -252,27 +257,33 @@ if ($updateinfo && ($sys_git_projects_file || $sys_git_cgitrepos_file)) { } } if (defined($proj_fd) || defined($cgit_fd)) { - foreach my $ref (GetDBHashArray("git_repo r,groups g,group_type t", - "g.group_id=r.group_id and g.type=t.type_id", - "g.unix_group_name as group_name,". - "g.type as group_type,". - "g.dir_git as dir_git,". - "r.name as repo_name,". - "r.master as master,". - "r.owner as owner,". - "r.description as description,". - "t.dir_git as group_dir_git")) { + db_foreach(sub { + my $ref = shift; + $ref->{feature}{git}{dir_type} = $ref->{group_type_dir_type_git}; + delete $ref->{group_type_dir_type_git}; + $ref->{feature}{git}{dir} = + $ref->{dir_git} || $ref->{group_type_dir_git}; + delete $ref->{dir_git}; + delete $ref->{group_type_dir_git}; + my $repo_name; - my $dir_git = $ref->{dir_git} ne '' - ? $ref->{dir_git} : $ref->{group_dir_git}; - - if ($ref->{master} eq 'N') { - $repo_name = $ref->{group_name}.'/'.$ref->{repo_name}; - } else { + if ($ref->{master} eq 'Y') { $repo_name = $ref->{repo_name}; + delete $ref->{repo_name}; + } else { + $repo_name = $ref->{unix_group_name} . '/' . $ref->{repo_name}; } - - $dir_git =~ s/\%PROJECT/$repo_name/; + + + my $obj = backend_feature('git', $ref); + unless ($obj) { + local $Data::Dumper::Indent = 0; + local $Data::Dumper::Terse = 1; + local $Data::Dumper::Purity = 0; + logit('err', "can't create git object for ".Dumper([$ref])); + next; + } + my $dir_git = $obj->directory; my $owner = $ref->{owner}; $owner =~ tr/ /+/; @@ -290,7 +301,25 @@ if ($updateinfo && ($sys_git_projects_file || $sys_git_cgitrepos_file)) { print $cgit_fd "repo.readme=$dir_git/README.html\n"; print $cgit_fd "\n"; } - } + }, + q{ +SELECT g.unix_group_name as unix_group_name, + g.group_id as group_id, + g.type as type, + g.is_public as is_public, + g.gidNumber as gidNumber, + t.name as group_type_name, + g.dir_git as dir_git, + t.dir_git as group_type_dir_git, + t.dir_type_git as group_type_dir_type_git, + r.name as repo_name, + r.master as master, + r.owner as owner, + r.description as description, + t.dir_git as group_dir_git +FROM git_repo r, groups g, group_type t +WHERE g.group_id=r.group_id and g.type=t.type_id +}); close $proj_fd if defined $proj_fd; close $cgit_fd if defined $cgit_fd; } diff --git a/db/mysql/table_git_repo.structure b/db/mysql/table_git_repo.structure index da7607e..d9c9a07 100644 --- a/db/mysql/table_git_repo.structure +++ b/db/mysql/table_git_repo.structure @@ -29,6 +29,7 @@ CREATE TABLE `git_repo` ( `updated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `synchronized` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`repo_id`), + UNIQUE KEY `group_id_2` (`group_id`,`name`), KEY `repo_id` (`repo_id`,`master`), KEY `repo_id_2` (`repo_id`,`name`), KEY `repo_id_3` (`repo_id`,`master`,`name`), diff --git a/lib/Savane/Feature.pm b/lib/Savane/Feature.pm index 140c02a..2793837 100644 --- a/lib/Savane/Feature.pm +++ b/lib/Savane/Feature.pm @@ -124,14 +124,29 @@ sub DESTROY { $obj->reset(); -Resets B<$obj> to initial values. -=cut +Resets B<$obj> to initial values. + +=cut + sub reset { my ($self) = @_; $self->{log} = [ [], [], [] ]; $self->{status} = FEATURE_UNCHANGED; } +=head2 directory + + $obj->directory() + +Returns directory path associated with B<$obj>. + +=cut + +sub directory { + my ($self) = @_; + return $self->{directory}; +} + =head2 status use Savane::Feature qw(:status); |