~yeliabmas/sloecode/wiki_mvp

« back to all changes in this revision

Viewing changes to sloecode/bzr/factory.py

  • Committer: Christopher Lee
  • Date: 2011-05-19 08:48:29 UTC
  • mfrom: (100 trunk)
  • mto: This revision was merged to the branch mainline in revision 101.
  • Revision ID: veebers@gmail.com-20110519084829-8fe65h3dv3erqoiy
Merge SSH Key Improvements

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
"""Functions relating to the handling of bazaar repositories and branches."""
2
2
 
 
3
from datetime import datetime
3
4
import os
 
5
from shutil import copytree, rmtree
4
6
 
5
7
from bzrlib import bzrdir, transport
6
8
from bzrlib.repository import Repository
35
37
class BazaarRepositoryFactory(object):
36
38
    """Responsible for creating repositories for people and projects."""
37
39
 
38
 
    def __init__(self, person_root_dir, project_root_dir):
 
40
    def __init__(self, person_root_dir, project_root_dir, 
 
41
    deleted_person_dir, deleted_project_dir):
39
42
        self.person_root_dir = person_root_dir
40
43
        self.project_root_dir = project_root_dir
 
44
        self.deleted_person_dir = deleted_person_dir
 
45
        self.deleted_project_dir = deleted_project_dir
 
46
        
41
47
        ensure_directory_exists(self.person_root_dir)
42
48
        ensure_directory_exists(self.project_root_dir)
 
49
        ensure_directory_exists(self.deleted_person_dir)
 
50
        ensure_directory_exists(self.deleted_project_dir)
43
51
 
 
52
    def get_user_repo_dir(self, person_name):
 
53
        """
 
54
        Get the directory for a users repository, given the username.
 
55
        """
 
56
        return os.path.join(self.person_root_dir, person_name)
 
57
    
 
58
    def get_project_repo_dir(self, project_name):
 
59
        """
 
60
        Get the directory for a project repository, given the project name.
 
61
        """
 
62
        return os.path.join(self.project_root_dir, project_name)
 
63
    
44
64
    def create_shared_repository_for_person(self, person_name):
45
65
        """Create an empty shared repo for person."""
46
 
        dir_name = os.path.join(self.person_root_dir, person_name)
 
66
        dir_name = self.get_user_repo_dir(person_name)
47
67
        create_shared_repo(dir_name)
48
68
 
49
69
    def create_shared_repository_for_project(self, project_name):
50
70
        """Create a repository for the project with a trunk branch."""
51
 
        dir_name = os.path.join(self.project_root_dir, project_name)
 
71
        dir_name = self.get_project_repo_dir(project_name)
52
72
        repo = create_shared_repo(dir_name)
53
73
        # Now to create the trunk.
54
74
        to_transport = repo.user_transport.clone('trunk')
62
82
        """Get a bzrlib.repository.Repository object for a given project
63
83
        name.
64
84
        """
65
 
        dir_name = os.path.join(self.project_root_dir, project_name)
 
85
        dir_name = self.get_project_repo_dir(person_name)
66
86
        return BazaarRepositoryAdaptor(Repository.open(dir_name))
67
87
        
68
88
    def get_repository_for_person(self, person_name):
69
 
        """Get a bzrlib.repository.Repository object for a given person
70
 
        login.
71
 
        """
72
 
        dir_name = os.path.join(self.person_root_dir, person_name)
 
89
        """
 
90
        Get a bzrlib.repository.Repository object for a given person login.
 
91
        """
 
92
        dir_name = self.get_user_repo_dir(person_name)
73
93
        return BazaarRepositoryAdaptor(Repository.open(dir_name))
 
94
    
 
95
    def delete_shared_repository_for_person(self, person_name):
 
96
        """
 
97
        Delete a personal repository. This function should only be called 
 
98
        AFTER the user account has been deleted. This function will create a
 
99
        copy of the users repository in the personal bzr repo backup folder.
 
100
        """
 
101
        src_dir = self.get_user_repo_dir(person_name)
 
102
        dst_dir = self.get_delete_folder_for_user(person_name)
 
103
        
 
104
        copytree(src_dir, dst_dir)
 
105
        rmtree(src_dir)
 
106
        
 
107
    def delete_shared_repository_for_project(self, project_name):
 
108
        """
 
109
        Delete a project repository. This function should only be called 
 
110
        AFTER the project has been deleted. This function will create a
 
111
        copy of the project repository in the project repo backup folder.
 
112
        """
 
113
        src_dir = self.get_project_repo_dir(project_name)
 
114
        dst_dir = self.get_delete_folder_for_project(project_name)
 
115
        
 
116
        copytree(src_dir, dst_dir)
 
117
        rmtree(src_dir)
 
118
        
 
119
    def get_delete_folder_for_user(self, person_name):
 
120
        """
 
121
        Get a path to a directory that does not yet exist, suitable for backing
 
122
        up a user repository.
 
123
        
 
124
        Directories are in the form <username>-<timestamp>, allowing
 
125
        administrators to easily differentiate between multiple user backups over
 
126
        time.
 
127
        """
 
128
        dt = datetime.utcnow()
 
129
        dirname = person_name + '-' + dt.strftime("%Y-%M-%d_%H%M%S")
 
130
        dirpath = os.path.join(self.deleted_person_dir, dirname)
 
131
        attempt = 0
 
132
        while (os.path.exists(dirpath)):
 
133
            if attempt != 0:
 
134
                dirpath = dirpath[:-2]
 
135
            dirpath += '_' + str(attempt)
 
136
            attempt += 1
 
137
            
 
138
        return dirpath
 
139
    
 
140
    def get_delete_folder_for_project(self, project_name):
 
141
        """
 
142
        Get a path to a directory that does not yet exist, suitable for backing
 
143
        up a user repository.
 
144
        
 
145
        Directories are in the form <username>-<timestamp>, allowing
 
146
        administrators to easily differentiate between multiple user backups over
 
147
        time.
 
148
        """
 
149
        dt = datetime.utcnow()
 
150
        dirname = project_name + '-' + dt.strftime("%Y-%M-%d_%H%M%S")
 
151
        dirpath = os.path.join(self.deleted_project_dir, dirname)
 
152
        attempt = 0
 
153
        while (os.path.exists(dirpath)):
 
154
            if attempt != 0:
 
155
                dirpath = dirpath[:-2]
 
156
            dirpath += '_' + str(attempt)
 
157
            attempt += 1
 
158
            
 
159
        return dirpath
 
 
b'\\ No newline at end of file'