I can believe fly.

Showing posts with label scm. Show all posts
Showing posts with label scm. Show all posts

Thursday, June 13, 2019

statsvn统计分析报告


介绍

statsvn工具是针对SVN日志信息进行代码统计,它将以一组表格与图表的静态html显示代码行数、开发者的代码行数、开发者活跃程度、开发者提交日志信息、文件(目录)大小等数据。本文主要针对利用它统计指定单版本或指定版本范围获取开发者代码行数出现的差异进行分析。

逻辑

  1. SVN操作动作:A(add) , R(replacing) , D(delete) , M(modified)
  2. 统计结果状态:new, del, changed
  • new:一种是取本地文件的行数;一种是diff的结果。
  • changed:行数则是diff的结果。
  • del:不算行数。一种是当前版本的删除文件。另外,如果当前版本删除之后,某版本删除了其文件夹,则其删除的文件算在后版本。
  1. 两者关系:
  • A->new:Add操作的文件,则状态会被置于new。
  • R-> new:单独指定一个SVN修订版时,文件如果为Replacing操作,则状态会被置于new。
  • R-> changed:指定多个修订版本范围,如果当前版本的文件为R,前一个修订版的文件状态为M,M,M,...R,R ,则统计结果的状态会置于changed。
  • D->del:所有删除操作都会被置于del。
  • M->new:如果M操作的文件被置于new,且行数为0,则说明本地代码所对应的文件不存在,中间有删除操作。
  • M->changed:modified操作的文件,则状态会被置于changed。

现象

以下几中现象,会对数据统计产生影响:
  1. 指定单版本统计:文件被新增,则有计算行数; 指定版本范围统计:当前版本被新增的文件,下一个版本被删除,则行数不在统计范围内。
  2. 指定单版本统计: 当前版本文件被修改,置于change,无变化行数; 指定版本范围统计:当前版本文件被修改,下个版本被删除。当前版本有计算行数。(缓存)
  3. 日志显示文件状态为R,则单版本(NEW +N),版本范围(changed)无行数。比如:1-100,修改状态为(M,M,M,...R,R ) ,统计单版本99时为new(有数字),整个版本范围时为changed。解释:R在单个版本的时候会被认为是new……版本范围中(非第一个版本)的时候被认为是changed……

Friday, August 14, 2015

Gradle构建Android应用

Gradle构建Android应用

Gradle 介绍

Gradle 基于DSL(领域特定语言)语法的自动化构建工具。其所有task可由Groovy代码控制,因此相对Maven那套标准性的流程或模板来说,Gradle会更加灵活,扩展性更强。

安装

  1. 下载 http://services.gradle.org/distributions/gradle-2.4-all.zip
  2. 解压到安装目录,例如/opt/tools/Gradle
  3. 添加GRADLE_HOME/bin to your PATH environment variable

简单build.gradle

buildscript {
    repositories {
    mavenCentral()
    }

    dependencies {
    classpath 'com.android.tools.build:gradle:1.1.3'
    }
}

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"
}

wrapper

安装完后,在项目的当前目录下执行 gradle init wrapper
如果是在已有maven配置的项目,gradle会自动识别转换,但部分配置还需要自行修改。
负责人使用wrapper初始化环境,开发团员的其它成员就可以不用自己安装了。
自动生成gradlew,build.gradle,settings.gradle等文件和相关目录
$ ./gradlew build

Downloading https://services.gradle.org/distributions/gradle-2.3-bin.zip
建议:在gradle项目里,尽量使用gradlew来编译,它会自动下载对应的版本,这样团队的其他成员就不需要手动安装了且可以保持大家使用的版本一致。

映射目录 sourceSets

如果你的工程是Eclipse 结构,那在build.gradle需要映射目录处理
android {
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        androidTest.setRoot('tests')
    }
}

依赖管理

设置从公司私服nexus下载依赖库

repositories {
      maven {
             url "http://127.0.0.1/nexus/content/groups/public"
    }
}

引用本地的aar库

repositories {
    flatDir {
    dirs 'libs'
    }
}

dependencies {
    compile(name:'cards', ext:'aar')
}

依赖jar

dependencies {
     compile group: 'com.duowan.mobile.uauth', name: 'yyauth', version:'1.7'
}
}

依赖so

dependencies {
         classpath 'com.nabilhachicha:android-native-dependencies:0.1+'
}

native_dependencies {
    artifact 'com.duowan.mobile.uauth:yyauth:1.7:armeabi'
    artifact 'com.duowan.mobile.uauth:yyauth:1.7:armeabi-v7a'
}

忽略lint的警告

lintOptions {
    abortOnError false
}

版本号设置

defaultConfig {
    versionCode System.getenv("BUILD_NUMBER") as Integer ?: 0     // 如果环境变量BUILD_NUMBER存在则读取,否则取0
    versionName version                                                                       //  version是gradle.propertise定义的属性
}

设置apk输出名称

方式1:设置archivesBaseName

defaultConfig {
    project.ext.set("archivesBaseName", "myAPP-" + versionName + "-" + versionCode);
}

方式2:获取输出文件名直接替换

defaultConfig {
    applicationVariants.all {
    variant -> changeApkName(variant)
}

def changeApkName(variant) {
    def apk = variant.outputs[0].outputFile
    def newName = ""
    newName = apk.name.replace(project.name, project.name + "-" + android.defaultConfig.versionName + "-" + android.defaultConfig.versionCode)
    if (variant.buildType.name == "release") {
        newName = newName.replace("-" + variant.buildType.name, "")
    }
    variant.outputs[0].outputFile = new File(apk.parentFile, newName)
    if (variant.outputs[0].zipAlign) {
        variant.outputs[0].zipAlign.outputFile = new File(apk.parentFile, newName.replace("-unaligned", ""))
    }
}

签名配置

android {
    signingConfigs {
        release
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
}

File signFile = file(System.getenv('HOME') + "/.android/sign.properties")
if( signFile.canRead() ) {
    Properties p = new Properties()
    p.load(new FileInputStream(signFile))

    if( p!=null
    && p.containsKey('key.store')
    && p.containsKey('key.store.password')
    && p.containsKey('key.alias')
    && p.containsKey('key.alias.password')
    ) {
        println "RELEASE_BUILD: Signing..."

        android.signingConfigs.release.storeFile = file( p['key.store'] )
        android.signingConfigs.release.storePassword = p['key.store.password']
        android.signingConfigs.release.keyAlias = p['key.alias']
        android.signingConfigs.release.keyPassword = p['key.alias.password']

    } else {
        println "RELEASE_BUILD: Required properties in signing.properties are missing"
        android.buildTypes.release.signingConfig = null
    }
    } else {
        println "RELEASE_BUILD: signing.properties not found"
        android.buildTypes.release.signingConfig = null
}

ndk-build

自动生成mk

defaultConfig {
    sourceSets {
        main {
            jni.srcDirs = []
        }
    }

    ndk {
        moduleName "singalsdk"
        abiFilter "armeabi-v7a,x86,armeabi"
        stl "stlport_shared"
    }
}

使用定制mk

task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
    def androidMKfile = "$projectDir/jni/Android.mk"
    def applicationMKfile = "$projectDir/jni/Application.mk"
    def ndkDir = System.env.ANDROID_NDK_HOME
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        def ndkbuildcmd = $ndkDir/ndk-build.cmd
    } else {
        def ndkbuildcmd = $ndkDir/ndk-build
    }
    def execmd = ["$ndkbuildcmd","-j16","NDK_PROJECT_PATH=$buildDir",
    "APP_BUILD_SCRIPT=$androidMKfile", "NDK_APPLICATION_MK=$applicationMKfile"]
    println(execmd)
    commandLine execmd
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}

利用productFlavor实现渠道包

初始化渠道包列表./../markets.list
productFlavors {
    def path="./../markets.list"
    file(path).eachLine { line->
        def channel = line
        if (!channel.trim().equals("")) {
            "$channel" {
                manifestPlaceholders=[channelname: channel]
            }
        }
    }
}

发布产物到Maven仓库(upload/publish)

Publishing artifacts(old)

Maven Publishing (new)

apply plugin: 'maven-publish'
apply plugin: 'signing'

def isReleaseBuild() {
    return version.contains("SNAPSHOT") == false
}

def getReleaseRepositoryUrl() {
    return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
    : "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}

def getSnapshotRepositoryUrl() {
    return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
    : "https://oss.sonatype.org/content/repositories/snapshots/"
}

def getRepositoryUsername() {
    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}

def getRepositoryPassword() {
    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}

group = GROUP 

task androidJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    exclude '**/*.so'
}

task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
}

task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.sourceFiles
}

task androidNativeJar(type: Jar) {
    classifier = 'so'
    from(new File(buildDir, 'libs'))
    include("**/*.so")
}

task androidNativeZip(type: Zip) {
    classifier = 'so'
    from(new File(buildDir, 'libs'))
    include("**/*.so")
}


android.libraryVariants

publishing {
    publications {
        maven(MavenPublication) {
            artifact bundleRelease
            artifact androidJavadocsJar
        }
    }
}

publishing {
    repositories {
        maven {
            credentials {
                username = getRepositoryUsername()
                password = getRepositoryPassword()
            }

            if(isReleaseBuild()) {
                url getReleaseRepositoryUrl()
            } else {
                url getSnapshotRepositoryUrl()
            }
        }
    }
}

生成jar文件

task clearJar(type: Delete) {
    delete 'build/libs/' + POM_ARTIFACT_ID + '_' + VERSION_NAME + '.jar'
}

task makeJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('release/')
    include('classes.jar')
    rename ('classes.jar', POM_ARTIFACT_ID + '_' + VERSION_NAME + '.jar')
}

makeJar.dependsOn(clearJar, build)

收集apk到target目录

task collectApks(type:Copy) {
description = "Copies APKs and Proguard mappings to the target directory"
from 'build/outputs/apk'
exclude '**/*-unaligned.apk'
into 'target'
}
assembleRelease.finalizedBy collectApks

常用命令

gradle --help
gradle tasks //列出task列表
gradle asD (gradle assembleDebug) //编译debug打包
gradle asR (gradle assembleRelease) //编译release打包
gradle asD --refresh-dependencies //强制刷新依赖
gradle asD --parallel //并行编译
gradle asD --parallel-threads 3
gradle clean

参考资料

Tuesday, April 28, 2009

Redmine项目管理工具介绍

前言

Redmine是一web目管理,基于Ruby on Rails 框架开发 .平台且支持多种数据库..

功能介绍

支持多目的管理

redmine平台就可以管理多個項目

个项目可以分解成多目來管理

目可以所有人可目成

在不同的目中可承担不同角色

可以方便激活或隐藏功能模块(wiki/版本/问题跟踪....

角色的限控制

自定义项目中所需要的角色

根据角色灵活分配权限

和甘特

通过日历,方便查看每个时间点上的任务

通过甘特图,方便查看每个任务的完成进度

、文和文件管理

供团队即时发布任何消息及共享文件

订阅(Feeds)和郵件通知

项目活动/变更/新闻/问题/问题变更都可通过Atom feeds获取通知

设置每項目独立wiki

Wiki页面即采用文本标记符,具有版本控制及比较功能

每个项目都可以拥有独立的wiki页面

置每讨论区

团队可以围绕某个主题建立讨论区,方便项目成员发表看法及观点

简单时间功能

在项目级别中,你可以制定某时间段的工作量报表

1. 以年/月/周/天为单位

2. 项目/活动/成员/问题等作为统计对象

支持問題、目和用户增加自定义属性

自定义属性可以像常规属性那样显示在问题列表中,并可以作为过滤器使用

您可以根据需要为问题、项目和用户添加属性

属性使用多种格式:文本、日期、证书、下拉列表、复选框

集成版本管理系統

可以为每个项目绑定已有的版本库

Redmine使您可以浏览版本库的内容,查阅和搜索变更信息

对比和注释(即追溯)查看器

支持的版本管理系统: Subversion, CVS, Mercurial, Darcs and Bazaar

支持多LDAP(单点)认证方式

Redmine使您可以通过多种LDAP方式认证用户

用户账户可在从目录服务中发现用户后被自动创建(可选的)

支持用自行注冊账号

您可以配置系统允许用户在线注册

提供3种用户激活方式:自动激活(不需要确认)、手动激活(由管理员激活)、通过邮件自动发送的邮件激活

支持多語言

· Bulgarian,Czech,Danish,Dutch

· English,Finnish,Chinese,French

· German,Hebrew,Italian,Japanese

· Lithuanian,Korean,Norvegian,Polish,Portuguese,Romanian

· Russian,Serbian,Spanish,Swedish,Ukrainian

支持多数据库

  Redmine可以使用的数据库有:MySQL、PostgreSQL、SQLite 

相关资讯

 http://218.107.133.32:5000/projects/ezwork/wiki/ZhRedmine 

Thursday, April 2, 2009

SVN属性介绍

tsvn:logtemplate
1.  说明:SVN修改日志模板设置,即设置提交时填写修改日志的模板格式.
2.  例子:符号 [修改的目录或单个文件] 详细说明
3.  缺陷: 定制了该模板属性,在提交的对话框中会显示该模板,如果有人不愿意按此格式写,加上日志不能为空,则就等于方便别人将模板的信息作为修改日志说明提交了.
4.  解决: 想要解决这个缺陷,可以考虑在hooks加入检测,如果日志信息与模板相同,此不能提交.

svn:keywords 
1.  说明:SVN关健字设置即在文件里如果出现指定$关键字$,则会被替换成实际值.
2.  例子:以下是针对SVN提供的几个关键字
a. aa.txt文件的头内容
$Rev::               $:  Revision of last commit
$Author::            $:  Author of last commit
$Date::              $:  Date of last commit
b.  属性设置
格式一: Rev Author Date   # 你可以让所有文件都生效
格式二: Rev Author Date *.txt #你可以指定生效的文件类型
注意: 假设是通过TortoiseSVN工具设置,则别忘了打勾Apply property recursively
因为该属性是针对文件而不是文件夹且设置格式:
c.  属性设置完提交查看aa.txt
$Rev:: 1058          $:  Revision of last commit
$Author:: ysl        $:  Author of last commit
$Date:: 2009-04-03 1#$:  Date of last commit
注意: 由于$Date::              $: 我们在文件中写上关键字加上对应的空格,等于是有固定的长度,所有过长的数据会被截断.

bugtraq:url  
1.  说明: BUG号链接之地址设置
2.  例子: http://bug系统地址?IssueID=%BUGID%
bugtraq:label
1.  说明: BUG号链接之标签设置,即会在提交对话框上增加标签组件的名称,默认Bug-ID / Issue-Nr:
2.  例子: BugID:

bugtraq:message
1.  说明: BUG号链接之信息设置,即会在修改日志里追加上对应的信息.其中%BUGID%值会替换成相应的值.
2.  例子: 响应处理bug:%BUGID%

bug其它设置
bugtraq:warnifnoissue BUG号链接之警告设置,
bugtraq:append 默认true,这个属性定义了IssueID是追加到日志信息的末尾(true),还是插入到日志信息的开始(false)
bugtraq:number 默认true,只能输入数字且逗号隔开多值.
bugtraq:logregex 设置正则表达式,自动从修改日志信自里获取.不增加单独输入框.

Wednesday, March 4, 2009

发布版本归档问题分析

  前段时间兴匆匆的定制了发布版本归档备份说明,大概的内容是发布版本有哪些类别/每个类别有哪些具体的版本/存储位置/存放的目录结构。当时就直接按照版本来划分目录结构了,即第一层是类别,第二层是具体的版本,第三层是对应的构建版本。今天在收集过往的版本时发现了一个问题。
  由于归档的版本要求除了安装包,其散文件也一样要存。那么,如果归档的发布版本与安装包与安装包的散文件不是一一对应关系,就会有个困惑:在归档的备份存储位置,N个版本共用的安装包散文件该如何存放呢,这时候就不是直接将构建版本拉到第三层就可以搞定的?想来想去,就是觉得当初定的结构一点也不适用了。
附加资料:
关系说明:
1. 归档版本[1]-安装包[1]-安装包散文件[1]
2. 归档版本[N]-安装包[N]-安装包散文件[1]
目录结构:
1. 构建版本的原始存放形式:
+ 20080304.100
| | - installfile 存放散文件
| | - package   存放安装包
| |  |- setup    存放特殊包
| |  |  |- A
| |  |  |- B
| |  |  |- C
| |  |  |- D
| |  |  |- E
2. 版本发布出去后存档形式:
+ 版本类别
| | - A 
| | - B   
| | - C 
| | - D   
| | - E 
改进方法:
1. 去掉第一层/第二层,直接以第三层形式存档,然后以记录形式来区分每个版本。(这是目前最优的方式),但这种方式也有一个缺陷:如果构建出来的所有版本并不是全部要发布的,那这时候是全部归档还是去掉不发布的版本呢?
2. 如果需要归类版本的话,那直接存储安装包就可以. 对应的散文件仍在构建版本存放的位置去取。(这是个人的理想方式,不过涉及的改进范围广)



Tuesday, January 20, 2009

StatSVN统计工具使用指南

= StatSVN统计工具使用指南 = == 概述 == * StatSVN是Java写的开源代码统计程序,从statCVS移植而来,能够从Subversion版本库中取得信息,然后生成描述项目开发的各种表格和图表。 == 目的 == * 本文目的是介绍statSVN的使用。 == 步骤 == 1. '''准备工作''' a. Java环境: StatSVN需要Java的运行环境支持,请确保java文件可以运行. a. 安装SVN客户端命令: Statsvn需要用到SVN命令,请确保可用 a. 下载StatSVN: http://www.statsvn.org/index.html下载 1. '''统计工作''' a. co工作拷贝: 从你要统计的SVN仓库获取一份数据到本地,请确保是最新版本。 a. 日志文件生成: 在工作拷贝的本地目录下执行 svn log --verbose --non-interactive --no-auth-cache --xml>statsvn.log ,生成该仓库的日志文件statsvn.log,该文件是给StatSVN分析用的,名称可自定义。 a. 统计: 执行java -jar statsvn.jar -output-dir "E:\SCM\starsvn\rel\" E:\WorkDir\svn.rdev\ACLrepos\statsvn.log E:\WorkDir\svn.rdev\ACLrepos ,其中后面三个参数分别是:统计文件生成路径 统计对象的日志文件 工作拷贝的本地目录 命令格式: java -jar statsvn.jar [options] ,其中[options]为可选参数,该参数格式及用法如下: {{{ -version print the version information and exitvyqye -output-dir directory where HTML suite will be savedvyqye -include include only files matching pattern, e.g. **/*.c;**/*.hvyqye -exclude exclude matching files, e.g. tests/**;docs/**vyqye -tags show matching tags in lines of code chart, e.g. version-.*vyqye -title vyqye -viewvc integrate with ViewVC installation at vyqye -bugzilla integrate with Bugzilla installation at vyqye -username username to pass to svnvyqye -password password to pass to svnvyqye -verbose print extra progress informationvyqye -xdoc optional switch output to xdocvyqye -threads how many threads for svn diff (default: 25)vyqye -concurrencyThreshold switch to concurrent svn diff if 1st call>thrvyqye eshold (default: 4000)vyqye -dump dump the Repository content on consolevyqye }}} 1. '''统计结果''' * 生成一批静态文件 * 利用浏览器打开index.html,查看: * 代码行数的时间线; * 针对每个开发者的代码行数 * 开发者的活跃程度 * 开发者最近的提交;这里new代表新增的文件,del代表删除文件,+int代表该文件新增代码行数,-int代表该文件删除代码行数vyqye * 文件数量 * 平均文件大小 * 最大文件 * 哪个文件是修改最多次数的 * 目录大小 * 带有文件数量和代码行数的Repository tree 1. '''相关资讯''' * statsvn用户手册: http://wiki.statsvn.org/User%20Manual.ashx

Svnmanager工具配置报告


0. 安装apache2.x+mysql5.x+php5.2.5+svn1.5.4  其中,php还需要安装VersionControl_SVN-0.3.1.tgz.tar
1. 将svnmanager工具解压到我的apache发布目录下/usr/local/www/apache22/data
如果你在发布目录下增加一个子目录即svnmanager,则在url访问时必带上即
http://192.168.0.1/svnmanager/index.php
2. 配置,在svnmanager的根目录下找到config.php.linux(这是针对linux)改名为config.php且修改以下信息:
$htpassword_cmd = "htpasswda工具的路径";
$svn_cmd = "svn工具路径";
$svnadmin_cmd = "svnadmin工具路径";

//Subversion locations
$svn_repos_loc = "仓库的父目录";
$svn_passwd_file = "账号文件";
$svn_access_file = "权限文件";
$admin_name = "svnmanager页面登陆账号";
$admin_temp_password = "svnmanager页面登陆账号的密码";
3. 问题
(1) 用admin登陆,只看到用户管理跟退出,奇怪,其它功能?
后面才发现,原来后台设置的账号是临时账号,你必须自己创建一个管理员的账号,重新登陆.
(2)操作:Repository administration->User/Gropu Privileges->任意一个select
错误信息:
[2] UserPrivilegesEditPage::require_once(VersionControl/SVN.php) [userprivilegeseditpage.require-once]: 
failed to open stream: No such file or directory (@line 201 in file C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\svnmanager\svnmanager\RepositoryModule\UserPrivilegesEditPage.php).
Debug Backtrace
#1 UserPrivilegesEditPage.php:201 -- pradoErrorHandler(...)
#2 UserPrivilegesEditPage.php:201 -- UserPrivilegesEditPage::onLoad()
#3 TControl.php:419 -- UserPrivilegesEditPage->onLoad(...)
#4 TPage.php:1079 -- TControl->onLoadRecursive(...)
#5 TPage.php:955 -- TPage->onLoadRecursive(...)
#6 TApplication.php:483 -- TPage->execute()
#7 index.php:5 -- TApplication->run() 
解决:
a. 查找查UserPrivilegesEditPage.php中的require_once("VersionControl/SVN.php"),确认下位置
b. 到相关pear下查找SVN.php文件的位置,本人自己找到是以下两个位置
/usr/ports/devel/pear-VersionControl_SVN/work/VersionControl_SVN-0.3.1
/usr/local/share/pear/VersionControl_SVN
c. 经过自己分析,将require_once("VersionControl/SVN.php")改为require_once("VersionControl_SVN/SVN.php")
d. 测试通过.
ps: 本人分析出一个规律是,这里的路径是pear的相对路径.所以这里解决方法只作参考不是所有人都受用,请根据实际情况调整.
同时,解决了用户管理,别忘组的管理也要调整即GroupPrivilegesEditPage.php 文件.
(3)解决中文乱码问题~参考别人,未实验
修改 svnmanager\global\header.tpl  将页面的字符集设置为 gbk 或者 gb2312

因为这里使用的是 mysql 数据库,因此修改 
svnmanager\prado-2.0.3\framework\Data\adodb\drivers\adodb-mysql.inc.php
在 function _connect 倒数第三行前加入 mysql_query("set names 'gbk'"); 
设定操作mysql的字符集为GBK

                        mysql_query("set names 'gbk'");                
                  if ($this->_connectionID === false) return false;
                if ($argDatabasename) return $this->SelectDB($argDatabasename);
                return true;        
        }
(4)用户管理中的邀请操作,邮件发送失败~参考别人,未实验
错误信息:
Something went wrong sending email, please contact server administrator!
说明: 没找到解决方法
(5)不能自动过滤不属于仓库
错误信息:
{svn: URL 'file:///storage/yslProR/conf' non-existent in that revision (cmd: svn list --non-interactive file:///storage/yslProR/conf)
Command used: svn list --non-interactive file:///storage/yslProR/conf}
说明:由于不支持过涉仓库,所以在获取不是svn仓库时,就会报如上错误了.


通用性考虑不全:
1.不支持ldap的账号,只能管理传统的账号文件
2.不支持导入原有的权限分配,需要重新建立
3.导入现有库不支持自动过滤不属于库的信息即会把指定父目录下的子目录都当作是库
4.不支持多库配不同的权限文件
5.权限文件的格式只能基于[库名:相对路径],不支持[相对路径]

改进建议:
1. 用admin登陆,应该提醒用户创建一个新的管理账号
2. 用新的管理账号登陆,进行数据初始化
a. 导入仓库:指定仓库的目录获取且支持自动过滤不相关的库
b. 用户初始化:
(a)支持一对一即一个仓库对应一份账号文件
(b) 支持多对一即多个仓库对应一份账号文件
(c) 支持ldap账号,获取数据库的账号信息
c. 权限初始化:
(a)支持一对一即一个仓库对应一份权限文件
(b) 支持多对一即多个仓库对应一份权限文件

Tuesday, January 13, 2009

redhat8装SVN工具

[root@DB-RH8-x86 root]# rpm -q apr
apr-0.9.5-0.2
[root@DB-RH8-x86 root]# rpm -q apr-util
apr-util-0.9.12-2
[root@DB-RH8-x86 root]# rpm -q neon
neon-0.24.7-1
[root@DB-RH8-x86 root]# rpm -q subversion
subversion-1.3.2-1
不要装apr-0.9.12-2.i386.rpm. 装apr-0.9.5-0.2.i386.rpm就可以了.

 * 以上是同事在redhat8装SVN工具 正常的版本组合,参考了

Thursday, November 27, 2008

工作环境变动

当前职责
1.  SVN仓库管理
2.  构建管理
3.  trac系统需求及问题反馈收集(盲目/没有方向)
4.  过程改进需求收集支持(盲目/没有方向)
5.  配置管理规范流程研究

明年职责:
1. SVN仓库管理
2. 构建管理(原创,目标:优化环境,尽可能达到自动且简易)
3. 版本管理(目标:针对二进制的安装包,将对应的功能组合对应上)
4. 安装包脚本维护(要学习打包工具nsis,疑虑:平常会不会很烦琐)
5. 内部工具维护(可能需要一门新的语言)


 也许是去年把饼画得太大块了,一年没有任何收获,什么摸清产品信息?什么构建管理?什么版本管理/基线管理?都不见踪影,也许该是时候重新考虑方向了. 经验需要积累,知识需要充电,好好加油吧.

Thursday, August 28, 2008

二进制文件版本管理

China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:刚才走开了……
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:嘿,人不在?
越中女儿 Miriam 说:可是刚刚我出去了
越中女儿 Miriam 说:你回来了么
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:我在这。
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:刚说到哪了。
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:数据存诸?
越中女儿 Miriam 说:忘了
越中女儿 Miriam 说:嗯
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:对象是二进制文件,大小估计平均在10M,20M,最大是2G。
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:你觉得用SVN来存储可靠吗?
越中女儿 Miriam 说:可以
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:速度会不会是个问题?
越中女儿 Miriam 说:我在想,你是不是可以采用类似于数字图书馆的方式
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:还有,我如何避免他们存储了重复的文件。必竟二进制文件在版本控制工具不会只是存储他们的差异。
越中女儿 Miriam 说:将测试案例前做一层元数据出来
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:于数字图书馆的方式??不是很明白。
越中女儿 Miriam 说:通过元数据去检索,定位
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:你这说的是索引的事吧。
越中女儿 Miriam 说:嗯,不仅仅是索引
越中女儿 Miriam 说:我想想看啊
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:如果说它的元数据就是我前面提的,就是一个二进制文件啊。
越中女儿 Miriam 说:噢?
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:必竟他本身的需求并不是说以测试案例为单位来存储的。
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:案例与文件的关系,是一对一,一对多的的关系。
越中女儿 Miriam 说:我知道,就是以存储单位为单位,生出相应的元数据
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:这,不是很理解。
越中女儿 Miriam 说:元数据就是存储内容的描述文件
越中女儿 Miriam 说:一般包含,名称、作者、版本、唯一标识符等等
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:这个是需要的。
越中女儿 Miriam 说:一般采用元数据的目的是因为关系数据库存储只能存储格式化数据,对于非格式化数据,最好先做一层描述,这样便于管理和操作
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:这对应的是我说的要方便索引文件属性信息(名称、作者、版本、唯一标识)
越中女儿 Miriam 说:噢
越中女儿 Miriam 说:开始慢慢了解你的需求了
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:真好。。。你继续说。
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:这边的唯一标识可能就是一个文件对应的MD5,然后可以方便通过查找出对应文件的信息,,名称/用途/版本/位置等等,
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:因为要版本控制,所以想到的是SVN,但考虑速度问题。提供一个FTP,供机器获取最新版本的文件(即直接获取SVN最新修订的),跑自动…………利用数据库进行索引设置,但觉得就一索引采用数据库是不是搞得复杂了。
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:整体的过程可能就是这样的情况
越中女儿 Miriam 说:我在想另外一个问题 China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:什么问题?
越中女儿 Miriam 说:如果svn对你存储的管理方式
越中女儿 Miriam 说:是类似于code的管理,还是类似于文档的管理
越中女儿 Miriam 说:因为不很了解你的数据,如果是类似于文档的那种,那么实际上就是一个拷贝 China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:蒙了。
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:肯定不是code的管理了。
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:不对。我想下。
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:我在咨询的时候,问过是存储什么类型的文件。对方就只说什么类型的都有。
越中女儿 Miriam 说:你说的是二进制的文件,所以,我就迷糊了
越中女儿 Miriam 说:算了,我中午有饭局 越中女儿
Miriam 说:下午回来和你说
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:好的。下午你几点在啊
越中女儿 Miriam 说:1:30
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:估计2点开始,我都在开会了。
越中女儿 Miriam 说:那就1点
China 58-1(TEL:2756;DMC.KSPEG.SCM.YUSULIAN.1896) 说:好啊。