func writeProject(s session.Store, projectName string, fileType string, fileName string, codeFile string, timeStamp int64, resourceFiles []string, image string, alternateFile string, alternateType string, commit string) Data { // if user is not logged in return userName := "" if s.Get("UserName") != nil { userName = s.Get("UserName").(string) } if userName == "" { beego.Error("No user name available.") return Data{} } if projectName == "" { beego.Error("No project name available.") return Data{} } // Check for rights if ok := models.CheckRight(userName, projectName, "Write"); !ok { return Data{ "Error": "Unsufficient rights for project " + projectName + ".", } } userDir := beego.AppConfig.String("userdata::location") + userName projectDir := userDir + "/" + beego.AppConfig.String("userdata::projects") + "/" + projectName // Write source files to new project directory data := writeSourceFile(s, fileName, projectName, fileType, codeFile, timeStamp, image, alternateFile, alternateType, true) outdatedFile := data["OutdatedFile"] if outdatedFile != nil && outdatedFile.(string) != "" { return data } // Copy resource files for i := 0; i < len(resourceFiles); i++ { resProject := resourceFiles[i][:strings.Index(resourceFiles[i], "/")] resType := resourceFiles[i][strings.LastIndex(resourceFiles[i], ".")+1:] filename := resourceFiles[i][strings.LastIndex(resourceFiles[i], "/")+1:] dir := "." if resProject == projectName { continue } switch resType { case "png": dir = beego.AppConfig.String("userdata::imagefiles") case "mp3": dir = beego.AppConfig.String("userdata::soundfiles") } err := copyFileContents(userDir+"/"+dir+"/"+resourceFiles[i], projectDir+"/"+dir+"/"+filename) if err != nil { beego.Error("Cannot copy resource file", resourceFiles[i], "from", userDir, "to", projectDir, "(", err.Error(), ")") } } // Add, commit and push if err := models.GitAddCommitPush(userName, projectDir, commit, false); err != nil { if err.Error() == "Conflicts" { data["Conflicts"] = "Solve conflicts." } else { beego.Error("Add, commit, push: ", err.Error()) } } return data }
func initProject(s session.Store, projectName string, fileType string, fileName string, codeFile string, resourceFiles []string, image string) Data { // if user is not logged in return if s.Get("UserName") == nil { beego.Error("No user name available.") return Data{} } if projectName == "" { beego.Error("No project name available.") return Data{} } userName := s.Get("UserName").(string) userDir := beego.AppConfig.String("userdata::location") + userName projectDir := userDir + "/" + beego.AppConfig.String("userdata::projects") + "/" + projectName bareDir := beego.AppConfig.String("userdata::location") + beego.AppConfig.String("userdata::bareprojects") + "/" + projectName ////////////////////////////////////////////////////////////////////7 // Everything, that has to be done for init a project _, err := os.Stat(bareDir) if !os.IsNotExist(err) { return Data{ "Error": "project exists", } } // Create new directory if err := os.MkdirAll(bareDir, os.ModePerm); err != nil { beego.Error("Cannot create directory", bareDir) } // Initialize as bare git directory _, err = git.InitRepository(bareDir, true) if err != nil { beego.Error("Cannot init git directory", bareDir, "(", err.Error(), ")") } // Clone it to own project directory options := git.CloneOptions{ Bare: false, } _, err = git.Clone(bareDir, projectDir, &options) if err != nil { beego.Error("Cannot clone git directory", bareDir, "into", projectDir, "(", err.Error(), ")") } // err = models.GitSetName(userName, userName+"@"+beego.AppConfig.String("userdata::emailserver")) // Create project directories models.CreateDirectories(projectDir, false) // Create .gitignore file with .spielplatz/project in it models.CreateTextFile(projectDir+"/"+".gitignore", beego.AppConfig.String("userdata::spielplatzdir")+"/rights") // Copy resource files for i := 0; i < len(resourceFiles); i++ { resType := resourceFiles[i][strings.LastIndex(resourceFiles[i], ".")+1:] filename := resourceFiles[i][strings.LastIndex(resourceFiles[i], "/")+1:] dir := "." switch resType { case "png": dir = beego.AppConfig.String("userdata::imagefiles") case "mp3": dir = beego.AppConfig.String("userdata::soundfiles") } err = copyFileContents(userDir+"/"+dir+"/"+resourceFiles[i], projectDir+"/"+dir+"/"+filename) if err != nil { beego.Error("Cannot copy resource file", resourceFiles[i], "from", userDir, "to", projectDir, "(", err.Error(), ")") } } // Mount resource directories models.MountResourceFiles(userName, projectName) // Create project config file projectFile := projectDir + "/" + beego.AppConfig.String("userdata::spielplatzdir") + "/project" file, err := os.Create(projectFile) if err != nil { beego.Error(err) } file.Close() cnf, err := config.NewConfig("ini", projectFile) if err != nil { beego.Error("Cannot create project file " + projectFile + " (" + err.Error() + ")") } cnf.Set("Playground", beego.AppConfig.String("userdata::name")) cnf.Set("Origin", "none") cnf.Set("Gallery", "false") cnf.SaveConfigFile(projectFile) // Create rights file rightsFile := projectDir + "/" + beego.AppConfig.String("userdata::spielplatzdir") + "/rights" file, err = os.Create(rightsFile) if err != nil { beego.Error(err) } file.Close() cnf, err = config.NewConfig("ini", rightsFile) if err != nil { beego.Error("Cannot create rights file " + rightsFile + " (" + err.Error() + ")") } for _, right := range models.PRR_NAMES { cnf.Set("rights::"+right, "true") } cnf.SaveConfigFile(rightsFile) // Create database entry user, _ := models.GetUser(userName) project := new(models.Project) project.Name = projectName project.Playground = beego.AppConfig.String("userdata::name") project.Origin = "none" project.Gallery = false project.Forks = 0 project.Stars = 0 models.CreateProjectDatabaseEntry(project, user, int64(1<<uint(len(models.PRR_NAMES)))-1) // Write source files to new project directory name := projectName + "." + fileType data := writeSourceFile(s, name, projectName, fileType, codeFile, int64(0), image, "", "", false) // Add all rights as return values data["Rights"] = models.PRR_NAMES // Only one user by now data["Users"] = []string{userName} // Add, commit and push err = models.GitAddCommitPush(userName, projectDir, beego.AppConfig.String("userdata::firstcommit"), true) if err != nil { beego.Error(err) } // Remove old files, if any if fileName != "" { deleteSourceFiles(s, []string{fileName}, nil) } return data }