aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-09-14 09:13:17 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2017-09-14 09:13:17 +0200
commitaacdfc0b674f09ba0545be0529ad4b4dfccb2176 (patch)
tree2bbad4551f05c3485d7f532edc1a1c65292a5114
parentf00fa7c860e3da817fd4b88a2d58cae130a70d50 (diff)
downloadsavane-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_groups69
-rw-r--r--db/mysql/table_git_repo.structure1
-rw-r--r--lib/Savane/Feature.pm19
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);

Return to:

Send suggestions and report system problems to the System administrator.